package naito_rescue.agent;

import java.awt.Shape;
import java.util.*;

import sample.*;
import rescuecore2.messages.*;
import rescuecore2.worldmodel.*;
import rescuecore2.Constants;
import rescuecore2.standard.components.*;
import rescuecore2.standard.entities.*;
import rescuecore2.standard.messages.*;
import rescuecore2.misc.geometry.*;

import naito_rescue.*;
import naito_rescue.agent.*;
import naito_rescue.communication.manager.*;
import naito_rescue.object.*;
import naito_rescue.router.*;
import naito_rescue.task.*;
import naito_rescue.task.job.*;
import naito_rescue.message.*;

/* NAITOEnvironmentAgent
*  . 「環境エージェント」の役割を担う
*  ..  メッセージのフィルタリングを行なう(受信したメッセージのみ)
*
*
*/
public abstract class NAITOEnvironmentAgent<E extends StandardEntity> extends NAITOHumanoidAgent<E>
{
	List<NAITOMessage> filteredMessages;
	@Override
    protected void postConnect() {
    	super.postConnect();
    	
    	filteredMessages = new ArrayList<NAITOMessage>();
    }
    
    /* NAITOEnvironmentAgent#think(time, changed, heard) */
    /* スーパークラスであるNAITOHumanoidAgentで受信したメッセージを
       自分のエージェントの種類によってフィルタリングする．
       フィルタリングされたメッセージはfilteredMessagesに格納され，
       各災害救助隊エージェント(FB, PF, AT)の中で使用される．
    */
   	@Override
	protected void think(int time, ChangeSet changed, Collection<Command> heard){
		String context = "NAITOEnvironment#think";
		super.think(time, changed, heard);
		
		/* フィルタリングされたメッセージを格納するリストを初期化する */
		filteredMessages.clear();
		/*  */
		List<NAITOMessage> allMessagesInThisTime = commManager.getMessages(time);
		if(allMessagesInThisTime != null && !allMessagesInThisTime.isEmpty()){
			logger.info("All messages received in this time's size() = " + allMessagesInThisTime.size(), context);
			logger.debug("All messages received in this time = " + allMessagesInThisTime, context);
			for(NAITOMessage message : allMessagesInThisTime){
				//logger.info("Received Message = " + message.toString(), context);
			}
		}else{
			logger.info("No messages received in this time. ", context);
		}
		
		//Filtering.
		context += ",filtering";
		if(this instanceof NAITOFireBrigade){
			// Filtering for FB.
			// FireMessageのみを受け取るようにフィルタリングする
			// (naito_rescue.message.FireMessage)
			if(allMessagesInThisTime != null && !allMessagesInThisTime.isEmpty()){
				for(NAITOMessage message : allMessagesInThisTime){
					if(message instanceof FireMessage){
						this.filteredMessages.add(message);
					}
				}
			}
			if(!this.filteredMessages.isEmpty()){
				logger.info("Filtered messages to FireBrigade.", context);
				logger.info("Filtered message's size() = " + this.filteredMessages.size(), context);
				logger.debug("Filtered message = " + this.filteredMessages, context);
			}else{
				logger.info("No messages filtered. ", context);
			}
		}else if(this instanceof NAITOPoliceForce){
			// Filtering for PF.
			// BlockedRoadMessage, HelpMeInBlockadeMessageのみ受けとるようにフィルタリングする
			if(allMessagesInThisTime != null && !allMessagesInThisTime.isEmpty()){
				for(NAITOMessage message : allMessagesInThisTime){
					if(message instanceof BlockedRoadMessage || message instanceof HelpMeInBlockadeMessage){
						this.filteredMessages.add(message);
					}
				}
			}
			if(!this.filteredMessages.isEmpty()){
				logger.info("Filtered messages to PoliceForce.", context);
				logger.info("Filtered message's size() = " + this.filteredMessages.size(), context);
				logger.debug("Filtered message = " + this.filteredMessages, context);
			}else{
				logger.info("No messages filtered. ", context);
			}
		}else if(this instanceof NAITOAmbulanceTeam){
			// Filtering for AT.
			// HelpMeInBuildingMessageのみ受け取るようにフィルタリングする
			if(allMessagesInThisTime != null && !allMessagesInThisTime.isEmpty()){
				for(NAITOMessage message : allMessagesInThisTime){
					if(message instanceof HelpMeInBuildingMessage){
						this.filteredMessages.add(message);
					}
				}
			}
			if(!this.filteredMessages.isEmpty()){
				logger.info("Filtered messages to PoliceForce.", context);
				logger.info("Filtered message's size() = " + this.filteredMessages.size(), context);
				logger.debug("Filtered message = " + this.filteredMessages, context);
			}else{
				logger.info("No messages filtered. ", context);
			}
		}
	}
}
